package com.netty.webSocket;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;

/**
 * Created by Administrator on 2018/9/11/011.
 */
public class WebSocketServerInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();

        pipeline.addLast(new HttpServerCodec());
        pipeline.addLast(new ChunkedWriteHandler());

        /**
         * Netty对Http的请求进行分段，比如长度是1000，需要切成N段，channelRead0如果不做处理的话是每段会回调一次。
         * 通过这个HttpObjectAggregator可以将各分段聚合成一个完成的Http请求
         * 参数表示指定聚合的字节长度。如果聚合的长度超过了这个长度需要调用 handleOversizedMessage
         */
        pipeline.addLast(new HttpObjectAggregator(8192));
        /**
         * 处理webSocket的处理器
         * 负责webSocket的握手、客户端服务端的心跳、文本及块内容传给下一个自定义的处理器处理
         * webSocket所有数据的传递都是以frame阵的方式来传递。
         *
         * sebSocket协议的名字一般是ws: ws://server:port/context_path
         * demo：ws://server:port/test
         */
        pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));
        pipeline.addLast(new TextWebSocketFrameHandler());
    }
}
